package Test02;

import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;
import java.util.stream.Stream;

//Stream流中间方法的使用
public class Test6 {
    public static void main(String[] args) {
        /*
        filter          过滤
        limit           获取前几个元素
        skip            跳过前几个元素
        distinct        元素去重,依赖(hashCode和lequals方法)
        concat          合并a和b两个流为一个流
        map             转换流中的数据类型

        注意1:中间方法，返回新的Stream流，原来的Stream流只能使用一次，建议使用链式编程
        注意2:修改Stream流中的数据，不会影响原来集合或者数组中的数据
         */

        ArrayList<String> list1 = new ArrayList<>();
        Collections.addAll(list1, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "张良", "张良", "王二麻子", "王二麻子", "谢广坤");

        ArrayList<String> list2 = new ArrayList<>();
        Collections.addAll(list2, "周芷若", "赵敏");

        //filter  过滤   把张开头的留下，其余的数据不要
        /*list.stream().filter(new Predicate<String>() {
            @Override
            public boolean test(String s) {
                //如果返回值为true，表示当前数据留下
                //如果返回值为false，表示当前数据舍弃
                return s.startsWith("张");
            }
        }).forEach(s -> System.out.println(s));*/

        //filter  过滤  把张开头且名字为3个字的留下，其余的数据不要
        //Lambda表达式
        list1.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));

        System.out.println("------------");

        //limit  获取前几个元素
        list1.stream().limit(3).forEach(s -> System.out.println(s));

        System.out.println("------------");

        //skip  跳过前几个元素
        list1.stream().skip(4).forEach(s -> System.out.println(s));

        System.out.println("------------");

        //获取："张强", "张三丰", "张翠山"
        list1.stream().limit(6).skip(3).forEach(s -> System.out.println(s));
        list1.stream().skip(3).limit(3).forEach(s -> System.out.println(s));

        System.out.println("------------");

        //distinct  元素去重
        list1.stream().distinct().forEach(s -> System.out.println(s));

        System.out.println("------------");

        //concat  合并
        Stream.concat(list1.stream(), list2.stream()).forEach(s -> System.out.println(s));

        System.out.println("------------");

        //map  转换流中的数据类型
        ArrayList<String> list3 = new ArrayList<>();
        Collections.addAll(list3, "张无忌-15", "周芷若-14", "赵敏-13", "张强-20", "张三丰-100", "张翠山-40", "张良-35", "王二麻子-37", "谢广坤-41");
        //需求：只获取里面的年龄并进行打印
        //String->int


        //第一个类型：流中原本的数据类型
        //第二个类型：要转成之后的类型

        //apply的形参s：依次表示流里面的每一个数据
        //返回值：表示转换之后的数据

        //当map方法执行完毕之后，流上的数据就变成了整数
        //所以在下面forEach当中，s依次表示流里面的每一个数据，这个数据现在就是整数了
        list3.stream().map(new Function<String, Integer>() {
            @Override
            public Integer apply(String s) {
                String[] arr = s.split("-");
                String ageString = arr[1];
                int age = Integer.parseInt(ageString);
                return age;
            }
        }).forEach(s -> System.out.println(s));

        System.out.println("===");

        //lambda表达式
        list3.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s -> System.out.println(s));
    }
}
